import {initMixin} from "./init";
import {eventsMixin} from "./events";
import {stateMixin} from "./state";
import {lifecycleMixin} from "./lifecycle";
import {renderMixin} from "./render";
import {initGlobalAPI} from "../global-api";

/**
 * Reactive 实例的构造函数
 * @param {Object} options
 * @constructor
 */
export class Reactive {

    constructor(options) {

        this._isReactive = true;

        // 是否是组件实例
        this.isComponent = false;

        this._self = null;
        this.$options = null;

        // initRender
        // 组件模板
        this.template = null;
        // 该组件对应的真实节点
        this.elem = null;

        // createElement 渲染辅助函数
        this._c = null;
        // 渲染函数代码
        this.renderCode = null;
        // 主体渲染函数
        this.render = null;
        // 静态节点树渲染函数
        this.staticRenders = {};

        // 本次生成的虚拟DOM
        this.vnode = null;
        // 上次生成的虚拟DOM，如果时第一次则为null
        this.preVNode = null;

        // 组件内容的父节点 Node|HTMLElement
        this.parent = null;
        // 组件内容的占位节点 VNode
        this.placeholder = null;

        // 组件节点的属性 Object
        this.props = null;
        // 组件节点挂载的监听器 Object
        this.listeners = null;

        // 该组件的插槽节点实现 Object
        this.slots = null;
        // 该组件的父组件实例 Reactive
        this.parentComponent = null;

        // watcher
        // 组件渲染 Watcher
        this.renderWatcher = null;


        // initState
        // data 的实例
        this._data = null;
        // method 的实例
        this._method = null;

        // event handler 的实例
        this._events = null;

        // 生命周期标志
        this._isMounted = false;

        this._init(options);
    }

}

initMixin(Reactive);
stateMixin(Reactive);
eventsMixin(Reactive);
lifecycleMixin(Reactive);
renderMixin(Reactive);
initGlobalAPI(Reactive);

